/**
 * 将对象参数转换为命令行参数字符串
 * @param {Object} options - 包含参数的对象
 * @returns {string} 格式化的命令行参数字符串
 */
function stringify(options) {
  // 如果 options 已经是字符串，直接返回
  if (typeof options === 'string') {
    return options
  }

  // 验证 options 是否为普通对象
  if (!options || typeof options !== 'object' || Array.isArray(options)) {
    throw new TypeError('Options 必须是一个普通对象')
  }

  const args = []

  // 辅助函数：格式化参数名称
  const formatParamName = (name) => {
    // 验证参数名称
    if (typeof name !== 'string' || !name.length) {
      throw new TypeError('参数名称必须是非空字符串')
    }

    // 根据是否以破折号开头来格式化参数名称
    if (name.startsWith('-')) {
      return name
    }

    return name.length === 1
      ? `-${name}`
      : `--${name.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`)}`
  }

  // 辅助函数：根据值的类型格式化值
  const formatValue = (value) => {
    // 处理 null 或 undefined 值
    if (value === null || value === undefined) {
      throw new TypeError('值不能为 null 或 undefined')
    }

    // 处理字符串值
    if (typeof value === 'string') {
      // 处理空字符串
      if (!value.length) {
        return '""'
      }
      // 转义引号并在需要时添加引号
      const needsQuotes = /[\s"']/.test(value)
      return needsQuotes ? `"${value.replace(/"/g, '\\"')}"` : value
    }

    // 处理数字值
    if (typeof value === 'number') {
      if (!Number.isFinite(value)) {
        throw new TypeError('数字值必须是有限的')
      }
      return value.toString()
    }

    // 处理布尔值
    if (typeof value === 'boolean') {
      return '' // 布尔标志不需要值
    }

    // 处理数组值
    if (Array.isArray(value)) {
      return formatValue(value.join(','))
    }

    // 抛出错误，表示不支持的值类型
    throw new TypeError(`不支持的值类型: ${typeof value}`)
  }

  // 处理每个选项
  for (const [key, value] of Object.entries(options)) {
    // 跳过 null、undefined、false 或空字符串值
    if ([null, undefined, false, ''].includes(value)) {
      continue
    }

    const paramName = formatParamName(key)

    // 处理布尔标志
    if (typeof value === 'boolean') {
      if (value) {
        args.push(paramName)
      }
      continue
    }

    // 处理数组值
    if (Array.isArray(value)) {
      if (value.length === 0) {
        continue // 跳过空数组
      }
      value.forEach((item) => {
        if (![null, undefined, false, ''].includes(item)) {
          const formattedValue = formatValue(item)
          if (formattedValue) {
            args.push(`${paramName}=${formattedValue}`)
          }
        }
      })
      continue
    }

    // 处理常规键值对
    const formattedValue = formatValue(value)
    if (formattedValue) {
      args.push(`${paramName}=${formattedValue}`)
    }
  }

  // 将所有参数连接成一个字符串
  return args.join(' ')
}

// 导出 stringify 函数
export { stringify }

// 默认导出
export default { stringify }
